#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>


//进程替换
int main()
{
  pid_t pid=fork();
  if(pid<0)
  {
    perror("fork");
    exit(-1);
  }
  else if(pid==0)
  {
    //child 让子进程做程序替换
   int tmp= execl("/bin/ps","ps","ajx",NULL);
   if(tmp<0)
   {
     exit(-1);
   }
    
  }
  else{
    //father
    int sat;
    if(wait(&sat)<0)
    {
      perror("wait");
      exit(-1);
    }
    
    if(WIFEXITED(sat))
    {
      //正常退出
      //获取退出码
      printf("child_proc exit code :%d\n",WEXITSTATUS(sat));
    }
    else{
      //异常退出
      printf("child_proc error:");
    }
  }
  
  return 0;
}




////进程等待
//int main()
//{
//  
//  pid_t pid;
//
//  if((pid=fork())==1)
//  {
//    perror("fork");
//    exit(-1);
//  }
//
//  if(pid==0)
//  {
//    //child
//    printf("child pid: %d\n",getpid());
//    sleep(8);
//    exit(10);
//  }
//  else{
//    //father
//    int sat=0; //设置为0，以防后面获取数据时
//    int ret=wait(&sat);
//    if(ret<0)
//    {
//      perror("wait");
//      exit(-1);
//    }
//    
//    //WIFEXITED(sat);
//    if((sat&0X7F)!=0)
//    {
//      //异常退出
//      printf("非正常退出，信号为%d\n",sat&0X7F);
//    }
//    else{
//      //正常退出
//      //WEXITSTATUS(sat);
//      printf("child exit code：%d\n",(sat>>8)&0XFF);
//    }
//  }
//  return 0;
//}

//测试getenv
//int main()
//{
//
//  char * env=getenv("MYENV");
//  if(env)
//  {
//    printf("%s\n",env);
//  }
//  
//  //char * s=getenv("PATH");
// // printf("%s\n",s);
//  return 0;
//}

//获取环境变量
//int main(int argc, char* argv[],char * env[])
//{
//  int i=0;
//  for(;env[i];i++)
//  {
//    printf("%s\n",env[i]);
//  }
//  return 0;
//}



//实现孤儿进程
//int main()
//{
//  if(fork()==0)
//  {
//    //child
//    sleep(20);
//  }
//  else{
//    //father 
//    sleep(10);
//  }
//  return 0;
//}





//实现僵尸进程
//int main()
//{
//  
//  if(fork()==0)
//  {
//    //child
//    printf("child_pid: %d, child_ppid: %d\n",getpid(),getppid());
//    sleep(8);
//  }
//  else{
//    printf("father_pid: %d, fatherd_ppid: %d\n",getpid(),getppid());
//    sleep(15);
//
//  }
//  return 0;
//}








//创建子进程
//int main()
//{
//
//  pid_t ret =fork();
//  if(ret<0)
//  {
//    perror("fork");
//    return 1;
//  }
//  else if(ret==0)
//  {
//    //child 
//    printf("child pid: %d\n",getpid());
//    printf("child ppid: %d\n",getppid());
//    sleep(10); 
//    
//  }
//  else{
//    //father
//    printf("father pid: %d\n",getpid());
//    printf("father ppid: %d\n",getppid());
//    sleep(10);
//  }
//  return 0;
//}
//    












//int main()
//{
//  
//  printf("pid: %d\n",getpid());
//  printf("ppid: %d\n",getppid());
//  int i=10;
//  while(i)
//  {
//    sleep(1);
//    i--;
//
//  }
//  return 0;
//}
